#ifndef __DI_H__
#define __DI_H__

//------------------------------------------------------------------------------
//
// Header
//
//------------------------------------------------------------------------------
#include <dinput.h>

//------------------------------------------------------------------------------
//
// Pragma
//
//------------------------------------------------------------------------------
#pragma comment( lib, "Dxguid.lib" )   // Search for the DXguid library at compile time
#pragma comment( lib, "Dinput8.lib" )  // Search for the DirectInput8 library at compile time

//------------------------------------------------------------------------------
//
// Macros
//
//------------------------------------------------------------------------------
#define dKEY( key ) ( g_szKeyBuf[ key ] & 0x80 ) // This is one of the coolest macros! It tests to see if a   
												 // key is currently pressed down or not.  Uses the DirectInput
												 // DIK_ key constants.                                        

#define dOKEY( key ) (g_szPKeyBuf[ key ]) // This is one of the coolest macros! It tests to see if a   
										  // key is currently pressed down or not.  Uses the DirectInput
										  // DIK_ key constants.  

#define SAFE_DELETE_DI(p) { if(p) {p->Destroy(); SAFE_DELETE(p);} }
                       
//------------------------------------------------------------------------------
//
// Direct input 8 class
//
// handles all input under DirectInput.
// Use the KEY_DOWN macro to see if a key is down or not.				   
//
//------------------------------------------------------------------------------
class CDI
{
public:
	LPDIRECTINPUT8       m_pDI;	

	 // Direct Input Device Keboard, Direct Input Device Mouse
	LPDIRECTINPUTDEVICE8 m_pDIDK;

	HWND CurWindowHandle;

public:
	CDI();
	virtual ~CDI();
	void Init(HWND hMainFrmWnd);
	void Free();

public:
	bool Create();
	void Destroy();
	void Update();
	void InvalidateDeviceObjects();
	void RestoreDeviceObjects();
};

extern UCHAR g_szKeyBuf[ 256 ]; 
extern UCHAR g_szOldKeyBuf[ 256 ]; // The keyboard's key buffer
extern UCHAR g_szPKeyBuf[ 256 ]; // The keyboard's key buffer

#endif __DI_H__

//------------------------------------------------------------------------------
//
// DirectInput keyboard scan codes
//
//------------------------------------------------------------------------------
/*
#define DIK_ESCAPE          0x01
#define DIK_1               0x02
#define DIK_2               0x03
#define DIK_3               0x04
#define DIK_4               0x05
#define DIK_5               0x06
#define DIK_6               0x07
#define DIK_7               0x08
#define DIK_8               0x09
#define DIK_9               0x0A
#define DIK_0               0x0B
#define DIK_MINUS           0x0C    // - on main keyboard 
#define DIK_EQUALS          0x0D
#define DIK_BACK            0x0E    // backspace 
#define DIK_TAB             0x0F
#define DIK_Q               0x10
#define DIK_W               0x11
#define DIK_E               0x12
#define DIK_R               0x13
#define DIK_T               0x14
#define DIK_Y               0x15
#define DIK_U               0x16
#define DIK_I               0x17
#define DIK_O               0x18
#define DIK_P               0x19
#define DIK_LBRACKET        0x1A
#define DIK_RBRACKET        0x1B
#define DIK_RETURN          0x1C    // Enter on main keyboard 
#define DIK_LCONTROL        0x1D
#define DIK_A               0x1E
#define DIK_S               0x1F
#define DIK_D               0x20
#define DIK_F               0x21
#define DIK_G               0x22
#define DIK_H               0x23
#define DIK_J               0x24
#define DIK_K               0x25
#define DIK_L               0x26
#define DIK_SEMICOLON       0x27
#define DIK_APOSTROPHE      0x28
#define DIK_GRAVE           0x29    // accent grave 
#define DIK_LSHIFT          0x2A
#define DIK_BACKSLASH       0x2B
#define DIK_Z               0x2C
#define DIK_X               0x2D
#define DIK_C               0x2E
#define DIK_V               0x2F
#define DIK_B               0x30
#define DIK_N               0x31
#define DIK_M               0x32
#define DIK_COMMA           0x33
#define DIK_PERIOD          0x34    // . on main keyboard 
#define DIK_SLASH           0x35    // / on main keyboard 
#define DIK_RSHIFT          0x36
#define DIK_MULTIPLY        0x37    // * on numeric keypad 
#define DIK_LMENU           0x38    // left Alt 
#define DIK_SPACE           0x39
#define DIK_CAPITAL         0x3A
#define DIK_F1              0x3B
#define DIK_F2              0x3C
#define DIK_F3              0x3D
#define DIK_F4              0x3E
#define DIK_F5              0x3F
#define DIK_F6              0x40
#define DIK_F7              0x41
#define DIK_F8              0x42
#define DIK_F9              0x43
#define DIK_F10             0x44
#define DIK_NUMLOCK         0x45
#define DIK_SCROLL          0x46    // Scroll Lock 
#define DIK_NUMPAD7         0x47
#define DIK_NUMPAD8         0x48
#define DIK_NUMPAD9         0x49
#define DIK_SUBTRACT        0x4A    // - on numeric keypad 
#define DIK_NUMPAD4         0x4B
#define DIK_NUMPAD5         0x4C
#define DIK_NUMPAD6         0x4D
#define DIK_ADD             0x4E    // + on numeric keypad 
#define DIK_NUMPAD1         0x4F
#define DIK_NUMPAD2         0x50
#define DIK_NUMPAD3         0x51
#define DIK_NUMPAD0         0x52
#define DIK_DECIMAL         0x53    // . on numeric keypad 
#define DIK_F11             0x57
#define DIK_F12             0x58

#define DIK_F13             0x64    //                    (NEC PC98) 
#define DIK_F14             0x65    //                     (NEC PC98) 
#define DIK_F15             0x66    //                     (NEC PC98) 

#define DIK_KANA            0x70    // (Japanese keyboard)            
#define DIK_CONVERT         0x79    // (Japanese keyboard)            
#define DIK_NOCONVERT       0x7B    // (Japanese keyboard)            
#define DIK_YEN             0x7D    // (Japanese keyboard)            
#define DIK_NUMPADEQUALS    0x8D    // = on numeric keypad (NEC PC98) 
#define DIK_CIRCUMFLEX      0x90    // (Japanese keyboard)            
#define DIK_AT              0x91    //                     (NEC PC98) 
#define DIK_COLON           0x92    //                    (NEC PC98) 
#define DIK_UNDERLINE       0x93    //                     (NEC PC98) 
#define DIK_KANJI           0x94    // (Japanese keyboard)            
#define DIK_STOP            0x95    //                     (NEC PC98) 
#define DIK_AX              0x96    //                     (Japan AX) 
#define DIK_UNLABELED       0x97    //                        (J3100) 
#define DIK_NUMPADENTER     0x9C    // Enter on numeric keypad 
#define DIK_RCONTROL        0x9D
#define DIK_NUMPADCOMMA     0xB3    // , on numeric keypad (NEC PC98) 
#define DIK_DIVIDE          0xB5    // / on numeric keypad 
#define DIK_SYSRQ           0xB7
#define DIK_RMENU           0xB8    // right Alt 
#define DIK_PAUSE           0xC5    // Pause 
#define DIK_HOME            0xC7    // Home on arrow keypad 
#define DIK_UP              0xC8    // UpArrow on arrow keypad 
#define DIK_PRIOR           0xC9    // PgUp on arrow keypad 
#define DIK_LEFT            0xCB    // LeftArrow on arrow keypad 
#define DIK_RIGHT           0xCD    // RightArrow on arrow keypad 
#define DIK_END             0xCF    // End on arrow keypad 
#define DIK_DOWN            0xD0    // DownArrow on arrow keypad 
#define DIK_NEXT            0xD1    // PgDn on arrow keypad 
#define DIK_INSERT          0xD2    // Insert on arrow keypad 
#define DIK_DELETE          0xD3    // Delete on arrow keypad 
#define DIK_LWIN            0xDB    // Left Windows key 
#define DIK_RWIN            0xDC    // Right Windows key 
#define DIK_APPS            0xDD    // AppMenu key 
#define DIK_POWER           0xDE
#define DIK_SLEEP           0xDF


// Alternate names for keys, to facilitate transition from DOS.

#define DIK_BACKSPACE       DIK_BACK            // backspace 
#define DIK_NUMPADSTAR      DIK_MULTIPLY        // * on numeric keypad 
#define DIK_LALT            DIK_LMENU           // left Alt 
#define DIK_CAPSLOCK        DIK_CAPITAL         // CapsLock 
#define DIK_NUMPADMINUS     DIK_SUBTRACT        // - on numeric keypad 
#define DIK_NUMPADPLUS      DIK_ADD             // + on numeric keypad 
#define DIK_NUMPADPERIOD    DIK_DECIMAL         // . on numeric keypad 
#define DIK_NUMPADSLASH     DIK_DIVIDE          // / on numeric keypad 
#define DIK_RALT            DIK_RMENU           // right Alt 
#define DIK_UPARROW         DIK_UP              // UpArrow on arrow keypad 
#define DIK_PGUP            DIK_PRIOR           // PgUp on arrow keypad 
#define DIK_LEFTARROW       DIK_LEFT            // LeftArrow on arrow keypad 
#define DIK_RIGHTARROW      DIK_RIGHT           // RightArrow on arrow keypad 
#define DIK_DOWNARROW       DIK_DOWN            // DownArrow on arrow keypad 
#define DIK_PGDN            DIK_NEXT            // PgDn on arrow keypad 
*/